// 1.布尔值
let isDone: boolean = true;
// 2. 数字
let num1: number = 1;
// 3.字符串
let str: string = `hello my name is ${num1} , 
  i'm ${num1} age years old !
`
// 4.数组
let arr: number[] = [1, 2, 3];
let list: Array<number | string> = [2, 3, 4, ""]; // 联合类型

// 5.元组Tuple（元组，数组）
let array: [string, number] = ['d', 1, 'w'];//元组

// 6.enum:枚举类型可以为一组数值赋予友好的名字，默认从0开始编号
// enum Color { red,green,blue };
// enum Color { red = 1,green,blue};
enum Color { red = 1, green = 2, blue = 3 };
let c: Color = Color.red;
let colorName: string = Color[2];
alert(colorName);

// 7.any:可以在编译阶段还不清楚类型的变量指定一个类型
let notSure: any = 4;
// notSure = "mabe a string instead";
// notSure = false;
notSure.ifItExists();
notSure.toFixed();
let prettySure: Object = 4;
// prettySure.toFixed(); // 报错
let anyList: any[] = [1, false, 'free'];
anyList[1] = 100;

// 8.void 没有任何类型；通常作为没有返回值的函数的类型
function warnUser(): void {
  alert('this is my warning message');
}

// 9.Null,Undefined
let u: undefined = undefined;
let n: null = null;

/* 
  10.Never表示那些永远不存在的值的类型。
    例如：总是会抛出异常或根本就不会有返回值的函数表达式或者箭头函数表达式的返回值类型
*/
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
  throw new Error(message);
}
// 推断的返回值的类型为never
function fail() {
  return error('something failed');
}
// 返回never的函数必须存在无法达到的终点
function infinitedLoop(): never {
  while (true) {

  }
}

/* 
  类型断言：通过这种当时告诉compiler，‘相信我，我知道自己在干什么’
  一种是‘尖括号’语法
  一种是as语法
*/
let someValue: any = 'this is a string ';
// let strLength: number = (<string>someValue).length;
let strLength: number = (someValue as string).length;